#ifndef INTERVAL_HPP
#define	INTERVAL_HPP

#include "Integer.hpp"
#include <boost/numeric/interval.hpp>
#include <iostream>

/*
 * We set interval_policies below to allow for empty intervals
 */
typedef Integer<int> iint; // int with support for infinities
typedef boost::numeric::interval_lib::rounded_math<iint> rounding_policy;
typedef boost::numeric::interval_lib::checking_no_nan<iint> checking_policy;
typedef boost::numeric::interval_lib::policies<rounding_policy, checking_policy> interval_policies;
typedef boost::numeric::interval<iint, interval_policies> Interval;

std::ostream& operator<<(std::ostream& os, const Interval& r);
bool interval_subset(Interval i1, Interval i2);
Interval interval_union(Interval i1, Interval i2);
Interval interval_intersection(Interval i1, Interval i2);
Interval interval_invert(Interval arg);
Interval interval_remove(Interval arg1, Interval arg2);


#endif	/* INTERVAL_HPP */

